// 引入内置模块（使用回调式API，模拟底层文件读取流程）
const http = require('http');
const fs = require('fs');
const path = require('path');

// 1. 确定目标文件（同程序①逻辑）
const targetFile = process.argv[2] ? path.resolve(__dirname, process.argv[2]) : __filename;
const BUFFER_SIZE = 1024; // 读取缓冲区大小（1KB，分块读取）

// 2. 封装底层文件读取函数（fs.open → fs.read → fs.close）
function readFileWithLowLevel(path, callback) {
  let fileContent = ''; // 存储最终文件内容
  let buffer = Buffer.alloc(BUFFER_SIZE); // 初始化缓冲区

  // 1. 打开文件（flag: 'r' 表示只读）
  fs.open(path, 'r', (err, fd) => {
    if (err) return callback(err); // 打开失败：回调传递错误

    // 2. 递归读取文件（分块读取，直到读完）
    function readChunk() {
      // 读取文件内容到缓冲区
      fs.read(fd, buffer, 0, BUFFER_SIZE, null, (err, bytesRead) => {
        if (err) {
          fs.close(fd, () => callback(err)); // 读取失败：关闭文件后传递错误
          return;
        }

        // bytesRead=0 表示已读取到文件末尾
        if (bytesRead === 0) {
          fs.close(fd, (closeErr) => {
            if (closeErr) return callback(closeErr);
            callback(null, fileContent); // 读取完成：回调传递内容
          });
          return;
        }

        // 拼接当前块内容（注意：仅取实际读取的字节数，避免缓冲区多余数据）
        fileContent += buffer.toString('utf8', 0, bytesRead);
        readChunk(); // 继续读取下一块
      });
    }

    readChunk(); // 启动第一次读取
  });
}

// 3. 创建HTTP服务
const server = http.createServer((req, res) => {
  if (req.url === '/' && req.method === 'GET') {
    res.setHeader('Content-Type', 'text/plain; charset=utf-8');
    // 调用底层读取函数
    readFileWithLowLevel(targetFile, (err, content) => {
      if (err) {
        res.statusCode = 404;
        res.end(`❌ 错误：${err.message}\n（底层读取流程：open→read→close）`);
        return;
      }
      res.statusCode = 200;
      res.end(`✅ 底层文件读取成功（${targetFile}）\n\n${content}`);
    });
  } else {
    res.statusCode = 404;
    res.end('❌ 页面未找到，请访问：http://localhost:8081');
  }
});

// 4. 启动服务
server.listen(8081, () => {
  console.log(`🚀 底层读取服务启动！`);
  console.log(`📂 目标文件：${targetFile}`);
  console.log(`🌐 访问地址：http://localhost:8081`);
});